package middleware

import (
	"fmt"
	"sync"
	"time"

	"github.com/gin-gonic/gin"
)

// clientAccessStats 用于存储每个客户端的访问时间记录
type clientAccessStats struct {
	accessTimes []time.Time
	mu          sync.Mutex
}

// accessStats 用于存储所有客户端的访问统计信息
var accessStats = make(map[string]*clientAccessStats)
var statsMu sync.Mutex

// RecordAccess 记录客户端的访问
func RecordAccess(clientID string) {
	statsMu.Lock()
	stats, exists := accessStats[clientID]
	if !exists {
		stats = &clientAccessStats{
			accessTimes: make([]time.Time, 0),
		}
		accessStats[clientID] = stats
	}
	statsMu.Unlock()

	stats.mu.Lock()
	stats.accessTimes = append(stats.accessTimes, time.Now())
	stats.mu.Unlock()
}

// GetAccessCountInLastMinute 获取客户端在过去一分钟内的访问次数
func GetAccessCountInLastMinute(clientID string) int {
	statsMu.Lock()
	stats, exists := accessStats[clientID]
	statsMu.Unlock()

	if !exists {
		return 0
	}

	stats.mu.Lock()
	defer stats.mu.Unlock()

	now := time.Now()
	oneMinuteAgo := now.Add(-time.Minute)

	// 移除一分钟前的访问记录
	for len(stats.accessTimes) > 0 && stats.accessTimes[0].Before(oneMinuteAgo) {
		stats.accessTimes = stats.accessTimes[1:]
	}

	return len(stats.accessTimes)
}

// AccessCountMiddleware 中间件，用于记录客户端访问并统计每分钟访问次数
func AccessCount() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 这里以 IP 地址作为客户端标识，实际应用中可根据需求修改
		var clientID string
		if client_id, ok := c.Get("clientid"); ok {
			clientID = client_id.(string)
		}
		RecordAccess(clientID)

		// 获取客户端在过去一分钟内的访问次数
		count := GetAccessCountInLastMinute(clientID)
		fmt.Println("每分钟访问次数：", count)
		// c.Set("mylog", string(count))
		// 可以将访问次数添加到响应头中，方便调试
		// c.Writer.Header().Set("X-Access-Count-In-Last-Minute", string(count))

		c.Next()
	}
}
